package com.tedu.api.list;

import org.junit.jupiter.api.Test;

import java.util.Deque;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * 队列   包位置：Java.util
 * Queue, Deque 队列
 *  作用：实现数据的有序存储，用于数据缓冲，多线程协调线程使用
 *  Collection顶级集合下子集：Queue集合接口一种
 */
public class QueueAPI {
    @Test
    public void testQueue(){
        //创建一个队列
        Queue<String> queue=new LinkedList<>();
        /**
         * offer(E e)   返回值：boolean --- - -add 一样
         * 作用：入队操作--队尾追加元素
         */
        queue.offer("1111"); queue.offer("1112");
        queue.offer("1113");queue.offer("1114");
        System.out.println("队列："+queue);
        /**
         * poll()   返回值：E
         * 作用：出队操作，获取队首元素，并且将元素从队列元素删除
         *
         */
        String str=queue.poll();
        str=queue.poll();
        System.out.println("队列出队："+str);
        System.out.println("队列："+queue);
        /**
         * peek()   返回值：E
         * 作用：出队操作，获取队首元素，不删除队列元素
         *
         */
        str=queue.peek();
        System.out.println("队列出队：[peek]"+str);

    }
    /**
     * 需求：队列--【历史名人】--遍历队列  while 队列中历史名人
     *                       【遍历之后元素清空】
     *                       遍历队列 增强for 队列中历史名人
     *                       【遍历之后元素存在】
     */
    @Test
    public void testHistory(){
        Queue<String> q=new LinkedList<>();
        q.offer("秦始皇");q.offer("王安石");
        q.offer("李白");q.offer("杜甫");
        //遍历1： while  队列中历史名人【遍历之后元素清空】
        while(q.size()>0){  //问：集合是否有元素
            q.poll();       //出队首，删除队首
        }
        System.out.println("队列："+q);
        //遍历2：增强for  队列中历史名人【遍历之后元素保存】
        for(String str:q){
            q.peek();
        }
        System.out.println("队列"+q);
    }
    /**
     * 双端队列 Deque接口 继承 Queue接口
     * 作用：入队和出队操作---保存数据，，可以在两端插入和删除元素
     * Deque接口中的方法：与Queue一致，拓展几个方法
     *
     */
    @Test
    public void testDeque(){
        //创建双端队列
        Deque<String> d=new LinkedList<>();
        d.offer("香蕉");d.offer("苹果");
        d.offer("葡萄");d.offer("茄子");
        System.out.println("Deque队列"+d);
        //双端增加：addFirst() 给队首添加元素  addLast()给队尾添加元素
        d.addFirst("西瓜");d.addLast("草莓");
        System.out.println("双端队列"+d);
        //双端删除：poll    peek
        d.pollFirst();//pollFirst()出队队首，队列中队首删除
        System.out.println("删除队首"+d);
        d.peekFirst();
        System.out.println("不删除队首"+d);
        //获取队列元素---队首，--队尾---geFirst/getLast
        System.out.println("队首"+d.getFirst());
        System.out.println("队尾"+d.getLast());

    }
    /**
     * 支持栈结构【业务：撤销操作】
     *      * push()：压栈---功能：offer一致
     *      * pop(): 出栈---功能：pollLast一致
     *      * --压栈：先进后出
     */

    @Test
    public void testStack(){
        Deque<String> stack=new LinkedList<>();
        stack.push("精卫");
        stack.push("后羿");
        stack.push("夸父");
        System.out.println("栈结构"+stack);
        String str=stack.pop();
        System.out.println("栈结构【出栈】"+str);
        System.out.println("双端队列："+stack);
        //队列中：pop poll peek方法使用特点
        //答：pop方法针对栈结构：特点：双端队列最后添加元素【队首】获取队首元素
        //   poll和peek是队列结构：特点：
        //                 针对队列追加元素【队首】，poll获取队首元素并删除，
        //                                      peek获取队首元素并保存。
    }

}
